package com.greensock.easing {
	public class Elastic {
		private static const _2PI : Number = Math.PI * 2;

		public static function easeIn(t : Number, b : Number, c : Number, d : Number, a : Number = 0, p : Number = 0) : Number {
			var s : Number;
			if (t == 0) return b;
			if ((t /= d) == 1) return b + c;
			if (!p) p = d * .3;
			if (!a || (c > 0 && a < c) || (c < 0 && a < -c)) {
				a = c;
				s = p / 4;
			} else s = p / _2PI * Math.asin(c / a);
			return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * _2PI / p)) + b;
		}

		public static function easeOut(t : Number, b : Number, c : Number, d : Number, a : Number = 0, p : Number = 0) : Number {
			var s : Number;
			if (t == 0) return b;
			if ((t /= d) == 1) return b + c;
			if (!p) p = d * .3;
			if (!a || (c > 0 && a < c) || (c < 0 && a < -c)) {
				a = c;
				s = p / 4;
			} else s = p / _2PI * Math.asin(c / a);
			return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * _2PI / p) + c + b);
		}

		public static function easeInOut(t : Number, b : Number, c : Number, d : Number, a : Number = 0, p : Number = 0) : Number {
			var s : Number;
			if (t == 0) return b;
			if ((t /= d * 0.5) == 2) return b + c;
			if (!p) p = d * (.3 * 1.5);
			if (!a || (c > 0 && a < c) || (c < 0 && a < -c)) {
				a = c;
				s = p / 4;
			} else s = p / _2PI * Math.asin(c / a);
			if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * _2PI / p)) + b;
			return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * _2PI / p) * .5 + c + b;
		}
	}
}